草庐IT

c++ - RAII 和 C++ STL

全部标签

c++ - RAII 什么时候比 GC 更有优势?

考虑这个在C++中演示RAII的简单类(从我的脑海中):classX{public:X(){fp=fopen("whatever","r");if(fp==NULL)throwsome_exception();}~X(){if(fclose(fp)!=0){//Anerror.Nowwhat?}}private:FILE*fp;X(Xconst&)=delete;X(X&&)=delete;X&operator=(Xconst&)=delete;X&operator=(X&&)=delete;}我不能在析构函数中抛出异常。我有一个错误,但没有办法报告它。这个例子非常通用:我不仅可以使用

c++ - STL <map> 允许重复对吗?

我编写了以下代码,并对输出感到惊讶。听说避免键冲突,但这里似乎允许插入重复对。#include#includeusingnamespacestd;intmain(){mapnamemap;namemap["yogi"]='c';namemap.insert(pair("yogendra",'a'));namemap.insert(pair("yogendra",'b'));cout此代码输出a.您可以在C++Shell上运行它.避免冲突是否意味着我们不能使用相同的key输入多对? 最佳答案 第二个insert使用相同的key是无操作

C++ RAII 不工作?

我刚刚开始使用C++中的RAII并设置了一个小测试用例。要么我的代码很困惑,要么RAII不工作!(我猜是前者)。如果我跑:#include#includeclassA{public:A(inti){i_=i;std::cout除了注释掉的异常(exception),我得到:A1constructedA2constructedA2destructedA1destructed正如预期的那样,但我得到的异常(exception)是:A1constructedA2constructedterminatecalledafterthrowinganinstanceof'std::exception

c++ - STL find 的性能优于手工循环

我有一些问题。给定以下C++代码片段:#include#include#include#include#includestructincrementor{incrementor():curr_(){}unsignedintoperator()(){returncurr_++;}private:unsignedintcurr_;};templatecharconst*value_found(Vecconst&v,typenameVec::const_iteratori){returni==v.end()?"no":"yes";}templatetypenameVec::const_ite

c++ - 是否所有 C++ STL 都会产生相同的随机数(对于相同的种子)?

是否所有C++STL都会产生相同的随机数(对于相同的种子)?这适用于所有平台吗?这是在某处指定的吗? 最佳答案 不,该标准不需要特定的实现。此外,获取随机数的唯一标准方法是rand和srand,它们不是最初STL的一部分,而是从C中接管的函数。 关于c++-是否所有C++STL都会产生相同的随机数(对于相同的种子)?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6094648/

c++ - 保留插入顺序但不允许重复的 STL 容器

这个问题在这里已经有了答案:关闭11年前.PossibleDuplicate:Astd::mapthatkeeptrackoftheorderofinsertion?我正在寻找一个保留插入顺序(无排序)但不允许重复的STL容器。有吗?如果没有任何我可以用来定制的技巧? 最佳答案 目前没有这样的容器,但您可以通过持有std::vector和std::set以便宜的方式创建自己的容器>一起上课。 关于c++-保留插入顺序但不允许重复的STL容器,我们在StackOverflow上找到一个类似

c++ - 如何从 STL 数据结构中删除 reverse_iterator?

由于某种原因,以下代码失败。您不能简单地使用它的base()方法删除reverse_iterator。#include#includeintmain(){std::setsetOfInts;setOfInts.insert(1);setOfInts.insert(2);setOfInts.insert(3);std::set::reverse_iteratorrev_iter=setOfInts.rbegin();std::set::reverse_iteratornextRevIter=setOfInts.rbegin();++nextIter;while(rev_iter!=set

c++ - 如何将 STL 对象存储在共享内存(C++)中?

我有以下代码模式:classA{doublea,b,c;...};classB{maptable;//CanhavemaximumofMAX_ROWSelements....};classC{Bentries;queued;queuee;...};现在我想在共享内存中存储一​​个C类型的对象,以便不同的进程可以追加、更新和读取它。我怎样才能做到这一点?(注意:我知道如何在共享内存中存储一​​个具有固定大小的简单C数组。另外,请记住B.table可能有任意条目。 最佳答案 使用boost::interprocess,这个库公开了这个功

c++ - 标准库 (STL) 容器是否支持一种 nothrow 分配形式?

new运算符(或对于POD,malloc/calloc)在分配大块内存时支持一种简单而有效的失败形式。假设我们有这个:constsize_tsz=GetPotentiallyLargeBufferSize();//1M-1000MT*p=new(nothrow)T[sz];if(!p){returnsorry_not_enough_mem_would_you_like_to_try_again;}...std::containers是否有任何这样的构造,或者我总是必须处理std::vector和friend的(预期的!!)异常?可能有一种方法可以编写一个自定义分配器来预分配内存,然后将

c++ - 当我们结合 RAII 和 GOTO 时会发生什么?

我想知道,除了纯粹出于好奇(因为没有人应该编写这样的代码!)之外,我想知道RAII的行为如何与goto(不是很可爱)。classTwo{public:~Two(){printf("2,");}};classGhost{public:~Ghost(){printf("BOO!");}};voidfoo(){{Twot;printf("1,");gotoJUMP;}Ghostg;JUMP:printf("3");}intmain(){foo();}在VisualStudio2005中运行以下代码时,我得到以下输出。1,2,3BOO!然而我想象、猜测、希望'BOO!'实际上不会出现,因为Gh